package br.com.mynage.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;


import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleModel;
import org.primefaces.model.UploadedFile;

import br.com.mynage.dominio.ArquivoTarefa;
import br.com.mynage.dominio.Sprint;
import br.com.mynage.dominio.Tarefa;
import br.com.mynage.dominio.Usuario;
import br.com.mynage.service.IServiceArquivo;
import br.com.mynage.service.IServiceTarefa;
import br.com.mynage.service.impl.ServiceArquivoImpl;
import br.com.mynage.service.impl.ServiceTarefaImpl;

/**
 * ManagedBean resposável pelas operações relacionadas �s tarefas.
 * @author Elaine
 *
 */
@ManagedBean(name="tarefaMBean")
@SessionScoped

public class TarefaMBean {
	
	
	private ScheduleModel tarefasCalendario;
	
	/**Lista de tarefas*/
	private List<Tarefa> tarefas;
	/** Objeto tarefa usado no form **/
	private Tarefa tarefa;
	/** Objeto serviço**/
	private IServiceTarefa servico;
	/**Sprint selecionado na listagem de sprints*/
	private Sprint sprint;
	/** Flag para determinar operação de edição/atualização**/
	private boolean isEditar;
	/** Arquivo de Upload, o arquivo que foi enviado. */
	private UploadedFile arquivo;
	/**Id do responsável pela */
	private int idResponsavel;
	
	/** Construtor Padrão**/
	public TarefaMBean() {
		this.tarefa = new Tarefa();
		servico = new ServiceTarefaImpl();
	}
	
	/**Método chamado quando o arquivo é submetido.*/
	public String submeterArquivo()  throws IOException {
		IServiceArquivo aService = new ServiceArquivoImpl();
		ArquivoTarefa at = new ArquivoTarefa();
		at.setNome(arquivo.getFileName());
		at.setExtensao(arquivo.getContentType());
		at.setTarefa(tarefa);
		aService.cadastrar(arquivo,at);
		
		return null;
	}
	
	/** Retorna tarefa **/
	public Tarefa getTarefa() {
		return tarefa;
	}

	/** Preenche tarefa **/
	public void setTarefa(Tarefa tarefa) {
		this.tarefa = tarefa;
	}
	
	/** Retorna serviço **/
	public IServiceTarefa getServico() {
		return servico;
	}

	/** Preenche serviço**/
	public void setServico(IServiceTarefa servico) {
		this.servico = servico;
	} 
	
	/** Indica se a o operação atual é edição ou não*/
	public boolean isEditar() {
		return isEditar;
	}

	/** Modifica o editar **/
	public void setEditar(boolean isEditar) {
		this.isEditar = isEditar;
	}
	
	/** Cadastra uma nova tarefa **/
	public String cadastrarTarefa(){
		tarefa.setResponsavel(new Usuario());
		tarefa.getResponsavel().setId(idResponsavel);
		tarefa.setSprint(sprint);
		servico.cadastrar(tarefa);
		
		return list();
	}
	
	/** Remove uma tarefa existente **/
	public String removerTarefa(){
		servico.remover(tarefa);
		return list();
	}
	
	
	/** Redireciona para a tela de visualização da tarefa.*/
	public String visualizar() {
		IServiceArquivo aService = new ServiceArquivoImpl();
		tarefa.setArquivo(aService.getArquivo(tarefa));
		return "/tarefa/form";
	}
	
	/** Atualiza um tarefa existente **/
	public String atualizar() {
		isEditar = true;
		return null;
	}
	
	/** Abre uma tarefa existente para edição **/
	public String editarTarefa(){
		servico.editar(tarefa);
		isEditar = false;
		return list();
	}
	
	/** Lista tarefas **/
	public String list(){
		tarefas = servico.getTarefas(sprint);
		tarefa = new Tarefa();
		isEditar = false;
		return "/tarefa/list";
	}

	public UploadedFile getArquivo() {
		return arquivo;
	}

	public void setArquivo(UploadedFile arquivo) {
		this.arquivo = arquivo;
	}

	public List<Tarefa> getTarefas() {
		return tarefas;
	}

	public void setTarefas(List<Tarefa> tarefas) {
		this.tarefas = tarefas;
	}

	public Sprint getSprint() {
		return sprint;
	}

	public void setSprint(Sprint sprint) {
		this.sprint = sprint;
	}
	
	public ScheduleModel getTarefasCalendario() {
		// popular as tarefas para por no calendario
		this.tarefasCalendario = new DefaultScheduleModel();
		
		if(this.servico != null){
			ServiceTarefaImpl serviceTarefaImpl = (ServiceTarefaImpl) this.servico;
			for(Tarefa tarefa : serviceTarefaImpl.listaTarefas){
				this.tarefasCalendario.addEvent(new DefaultScheduleEvent(tarefa.getNome(), 
						tarefa.getDataInicial(), tarefa.getDataFinal()));
			}
		}
		
		//retorna as tarefas para o calendario
		return tarefasCalendario;
	}

	public void setTarefasCalendario(ScheduleModel tarefasCalendario) {
		this.tarefasCalendario = tarefasCalendario;
	}
	
	
	public int getIdResponsavel() {
		return idResponsavel;
	}

	public void setIdResponsavel(int idResponsavel) {
		this.idResponsavel = idResponsavel;
	}

	public List<SelectItem> getUsuariosCombo() {
		List<SelectItem> itens =  new ArrayList<SelectItem>();
			for(Usuario u: sprint.getProjeto().getUsuarios()) {
				itens.add(new SelectItem(u.getId(), u.getNome()));
			}
		
		return itens;
	}
	
}

